#include <iostream>
#include <functional>
#include <vector>
#include <condition_variable>
#include <thread>
#include <mutex>
#include <queue>

const int num = 5;

// 线程池类
class ThreadPool {
private:
    std::vector<std::thread> _threads;      // 工作线程
    std::queue<std::function<void()>> _tasks; // 任务队列
    std::mutex _mutex;                      // 互斥锁
    std::condition_variable _cond;          // 条件变量
    bool _stop;                             // 停止标志

public:
    // 构造函数：初始化线程池
    ThreadPool(size_t numThreads = num) : _stop(false) {
        for (size_t i = 0; i < numThreads; ++i) {
            _threads.emplace_back([this]() {
                while (true) {
                    std::function<void()> task;
                    {
                        std::unique_lock<std::mutex> lock(_mutex);
                        // 等待任务或停止信号
                        _cond.wait(lock, [this]() { 
                            return _stop || !_tasks.empty(); 
                        });
                        if (_stop && _tasks.empty()) return;
                        task = std::move(_tasks.front());
                        _tasks.pop();
                    }
                    task(); // 执行任务
                }
            });
        }
    }

    // 析构函数：销毁线程池
    ~ThreadPool() {
        {
            std::unique_lock<std::mutex> lock(_mutex);
            _stop = true;
        }
        _cond.notify_all(); // 唤醒所有线程
        for (auto& thread : _threads) {
            thread.join();
        }
    }

    // 添加任务到线程池
    void enqueue(std::function<void()> task) {
        {
            std::unique_lock<std::mutex> lock(_mutex);
            if (_stop) {
                throw std::runtime_error("enqueue on stopped ThreadPool");
            }
            _tasks.emplace(std::move(task));
        }
        _cond.notify_one(); // 唤醒一个等待的线程
    }
};